Spring Framework:4.3.14.RELEASE
Spring IOC 容器可以管理容器中 Bean 的生命周期。
容器中 Bean 的生命周期:
- 通过构造器或工厂方法创建 Bean 实例
- 为 Bean 的属性设置属性值和属性引用
- 调用 Bean 指定的 init 方法
- 提供 Bean 正常使用
- 容器关闭时,调用 Bean 指定的 destroy 方法
这样一个类:
1 |
|
1 | "1.0" encoding="UTF-8" xml version= |
在容器启动时,可以看到 构造函数 Car() 最先被执行,然后是 SetBrand() 方法被执行,其次是 init() 方法被执行,当容器被关闭时,destrory() 方法被执行。
Spring Framework 中 bean 标签中有 init-method 属性和 destroy-method 属性分别用于指定 Bean 的 init 方法和 destroy 方法。
Spring Framework 在 beans 标签还提供了 default-init-method 属性和 default-destroy-method 属性用于批量指定 Bean 的默认 init 方法和 destroy 方法。
1 |
|
1 | "1.0" encoding="UTF-8" xml version= |
但是如果两者一起使用,那么 default-init-method 和 default-destroy-method 方法会被忽略
Spring Framework 还提供了 InitializingBean 接口,用于在 Bean 实例化完成后进行额外处理。
1 |
|
在容器启动时,可以看到 构造函数 Smart() 最先被执行,然后是 SetBrand() 方法被执行,之后 afterPropertiesSet 也会被执行。
那么 InitializingBean 和 default-init-method、default-destroy-method 可否一起作用呢?
1 | package com.example.spring; |
通过测试,发现两者可以一起工作,且 afterPropertiesSet() 方法会优先执行。
那么 InitializingBean 和 init-method、destroy-method 可否一起作用呢?
1 | import org.springframework.beans.factory.InitializingBean; |
通过测试,发现两者可以一起工作,且 afterPropertiesSet() 方法会优先执行。
同理 Spring Framework 还提供了 DisposableBean 接口 做类似的 destroy-method 方法和 default-destroy-method 方法
总结:
Initialization callbacks
- 优先级最高的是通过实现 org.springframework.beans.factory.InitializingBean 接口的 afterPropertiesSet() 方法
- 次一级优先级是 bean 标签里的 init-method 属性指定的方法,但是可以和org.springframework.beans.factory.InitializingBean 接口的 afterPropertiesSet() 方法共存
- 最次优先级的是 beans 标签里的 default-init-method ,可以和org.springframework.beans.factory.InitializingBean 接口的 afterPropertiesSet() 方法共存,但不能和 bean 标签里的 init-method 属性指定的方法共存
Destruction callbacks
- 优先级最高的是通过实现 org.springframework.beans.factory.DisposableBean 接口的 destroy() 方法
- 次一级优先级是 bean 标签里的 destroy-method 属性指定的方法,但是可以和org.springframework.beans.factory.DisposableBean 接口的 destroy() 方法共存
- 最次优先级的是 beans 标签里的 default-destroy-method ,可以和org.springframework.beans.factory.DisposableBean 接口的 destroy() 方法共存,但不能和 bean 标签里的 destroy-method 属性指定的方法共存